package com.atguigu.rabbitmq.day03;

import com.atguigu.rabbitmq.utils.RabbitMqUtils;
import com.atguigu.rabbitmq.utils.SleepUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

//本次测试是为了验证消息在手动应答时是不丢失的，会放回到队列中重新消费
public class Worker04 {
    public static  final String task_queue_name="ack_queue";
    //接收消息
    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        System.out.println("C2等待接收消息，处理时间较长");

        DeliverCallback deliverCallback=( consumerTag,  message)->{
            //沉睡30s
            SleepUtils.sleep(30);
            System.out.println("接受到的消息"+new String(message.getBody(),"Utf-8"));
            //手动应答
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };
        //设置不公平分发
        //int prefetchCount=1;
        //设置欲取值
        int prefetchCount=5;
        channel.basicQos(prefetchCount);
        //采用手动应答
        boolean autoAck=false;
        channel.basicConsume(task_queue_name,autoAck,deliverCallback,(consumerTag -> {
            System.out.println(consumerTag+"消费者取消消费接口回调逻辑");
        }));

    }
}
/*给每个消费者分发消息有三种：1.轮询(int prefetchCount=0) 2.不公平分发（int prefetchCount=1）3.欲取值（int prefetchCount=2或其他任何数）
轮询是你一个我一个，不公平分发是能者多劳，不会让队列有空闲的，欲取值是定义通道上允许的未确认消息的最大数量，比如这里int prefetchCount=5
那么channel最大会积压5条消息*/
